package com.zzz.schedule.common;


/**
 * 全局统一响应结果封装类
 * 用于标准化API接口的返回格式，包含状态码、响应消息和业务数据
 * @param <T> 响应数据的泛型类型，支持任意数据类型
 */
public class Result<T> {
    // 返回码：表示请求处理的状态（成功/失败/异常等）
    private Integer code;

    // 返回消息：对处理结果的文字描述（如"操作成功"、"参数错误"等）
    private String message;

    // 返回数据：业务处理的具体数据，泛型支持各种数据类型
    private T data;

    /**
     * 无参构造方法
     * 用于JSON序列化等场景
     */
    public Result() {
    }

    /**
     * 构建基础响应对象
     * @param data 响应数据
     * @param <T> 数据类型
     * @return 包含数据的Result对象
     */
    protected static <T> Result<T> build(T data) {
        Result<T> result = new Result<>();
        if (data != null) {
            result.setData(data);
        }
        return result;
    }

    /**
     * 构建完整响应对象
     * @param body 响应数据
     * @param code 状态码
     * @param message 响应消息
     * @param <T> 数据类型
     * @return 包含数据、状态码和消息的Result对象
     */
    public static <T> Result<T> build(T body, Integer code, String message) {
        Result<T> result = build(body);
        result.setCode(code);
        result.setMessage(message);
        return result;
    }

    /**
     * 通过枚举构建响应对象
     * @param body 响应数据
     * @param resultCodeEnum 结果状态枚举（包含状态码和消息）
     * @param <T> 数据类型
     * @return 基于枚举的完整Result对象
     */
    public static <T> Result<T> build(T body, ResultCodeEnum resultCodeEnum) {
        Result<T> result = build(body);
        result.setCode(resultCodeEnum.getCode());
        result.setMessage(resultCodeEnum.getMessage());
        return result;
    }

    /**
     * 快速构建成功响应
     * @param data 响应数据
     * @param <T> 数据类型
     * @return 包含成功状态和数据的Result对象
     */
    public static <T> Result<T> ok(T data) {
        return build(data, ResultCodeEnum.SUCCESS);
    }

    /**
     * 链式设置响应消息
     * @param msg 响应消息
     * @return 当前Result对象（支持链式调用）
     */
    public Result<T> message(String msg) {
        this.setMessage(msg);
        return this;
    }

    /**
     * 链式设置状态码
     * @param code 状态码
     * @return 当前Result对象（支持链式调用）
     */
    public Result<T> code(Integer code) {
        this.setCode(code);
        return this;
    }

    // Getter和Setter方法
    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}
